AWS Copilot でAWS Fargateに簡単デプロイしてみよう
検証のためFargateへデプロイが簡単と噂のCopilotを急遽使ってみました。
- DockerfileがあればFargateへのデプロイ準備整ったようなもの
- ローカルで作ってたものを簡単にFargateに載せられます
- copilot-cliのインストールは必要
デフォルト設定で構築できるテスト環境
本記事では Load Balanced Web Service のサービス設定でデプロイします。Copilotにより構築される環境は以下のイメージです。
つかってみた
備忘録をかねて手元のDockerfileがFargateにコンテナとしてデプロイされロードバランサ経由でアクセスできるまでを残します。
まず、いきさつを説明するとDockerfile
を作成しローカルで動作確認をおえました。ここからが問題です。スパッとFargateに載せて動作検証したいことがあるのですが気分がのりません。簡単にデプロイできると噂に聞いていた Copilot の出番か?と調べてみます。
最低限求められるものが、アプリケーションと Dockerfile のみです。
ただいまのディレクトリの状況です。Dockerfile
とmain.go
(アプリケーション)があります。後は勢いだけでデプロイできそうな機運が高まります。
> tree . ├── Dockerfile ├── go.mod ├── go.sum └── main.go
Copilotインストール
前提としてAWS CLIやDockerがインストールされている必要があります。
私の環境ではcopilotのインストールだけで済み、コマンドひとつで準備が整いました。
> brew install aws/tap/copilot-cli
バージョン確認
> copilot -v copilot version: v1.0.0
Install Copilot - AWS Copilot CLI
Copilotでデプロイ
Getting startedではデモアプリを利用しています。私は手元のDockerfileをFargateにデプロイが目的なのでやってみてダメだったら考えることにします。デプロイに至るまでインタラクティブに入力を求められました。せっかくなので最初から見ていきましょう。
copilot init
でアプリケーション名を聞かれるので入力します。
> copilot init Welcome to the Copilot CLI! We're going to walk you through some questions to help you get set up with an application on ECS. An application is a collection of containerized services that operate together. What would you like to name your application? [? for help] sample-api-server ←入力した箇所
ロードバランサーは使いたかったのでそのまま進ます。
Application name: sample-api-server Which workload type best represents your architecture? [Use arrows to move, type to filter, ? for more help] > Load Balanced Web Service Backend Service Scheduled Job
ロードバランスされる WEBサービスの名前 を聞かれます。パッと見て ELBの名前か と勘違い。sample-api-lb
と入力しました。あとで分かりましたがECRのリポジトリのイメージ名もここで指定した名前が付きます。サービス名に対して、ロードバランサの名前をつけてかっこ悪いことになったのでお気をつけてください。
Application name: sample-api-server Workload type: Load Balanced Web Service What do you want to name this Load Balanced Web Service? [? for help] sample-api-lb ←入力した箇所
ECRのココの名前のことです。
カレントディレクトリにDockerfile
あるのでそのまま進めます。
Application name: sample-api-server Workload type: Load Balanced Web Service Service name: sample-api-lb Which Dockerfile would you like to use for sample-api-lb? [Use arrows to move, type to filter, ? for more help] > ./Dockerfile Enter custom path for your Dockerfile Use an existing image instead
テスト環境でデプロイしても良いかと聞かれるので、y
で進ます。
Would you like to deploy a test environment? [? for help] (y/N)
ECRリポジトリに保存されるDockerイメージのイメージタグ名を聞かれます。
Note: Couldn't find a git commit sha to use as an image tag. Are you in a git repository? Input an image tag value: latest ←入力した箇所
その後は10分ほど放置してデプロイ完了しました。簡単すぎて逆に不安です。
✔ Deployed sample-api-lb, you can access it at http://sampl-Publi-147UVZMTUH7X7-1197417906.us-east-1.elb.amazonaws.com.
補足
copilot init
実行時に引数で設定値を指定した実行も可能です。といっても初見ではなにを設定するのかわかっていなかったので対話型で答えていきました。
ドキュメント記載の実行例
copilot init --app demo \ --name api \ --type 'Load Balanced Web Service' \ --dockerfile './Dockerfile' \ --port 80 \ --deploy
ロードバランサ経由してコンテナ接続テスト
コンテナで動いているアプリケーションは検証のため適当な値を返すAPIサーバが欲しくて作ったモックです。実行結果に深い意味はなく、ELBのURLへアクセスして実行結果が返ってきたら動作確認はOKのです。デプロイ完了時にELBのURLが表示されていたのでcurl
でアクセスしてみます。
GETリクエストで網走市の人口が返ってきます。
> curl http://sampl-Publi-147UVZMTUH7X7-1197417906.us-east-1.elb.amazonaws.com {"Place":"Abashiri","Population":34920}
POSTはplace
で指定した地名(文字列)にテキトーな人口(ランダムな正数)を埋めて返します。正常に動作しています。謎のAPIなので正常かと言えるかはあれですけども本人の意図通り動いているのでヨシ!
> curl -X POST http://sampl-Publi-147UVZMTUH7X7-1197417906.us-east-1.elb.amazonaws.com/location -d place="kitami" {"Place":"kitami","Population":305}
マネジメントコンソールから見てみる
デフォルトの設定のテスト環境用に構築されたリソースを見てましょう。
新規にVPCが作成されています。
サブネットはPublic2個、Private2個作成されています。
ルートテーブルはPublicSubnet用にインターネットゲートウェイから外へ出られる設定が入っています。PrivateSubnet用は明示的にルートテーブルは作成されず、VPC内のローカル通信のみが許可されています。NAT Gatewayは作成されていません。
セキュリティグループはELB用に80,443がフルオープンと、コンテナ用に他のコンテナと、ELBから許可のインバウンドルールが設定されています。
文字が小さくて読めなかったですね...
ECSクラスターは本来は設定ファイルでいろいろ設定することになるはずなので中身は省略。
Copilotで作成したリソースの削除
こんなに簡単にデプロイできるなら削除してもまた作り直せばいいやと思い削除してみます。
削除対象のCopilotで管理しているアプリケーション名を確認します。
> copilot app ls sample-api-server
調べた名前を指定してcopilot app delete
でリソースを削除できます。
> copilot app delete --name sample-api-server Are you sure you want to delete application sample-api-server? Yes
簡単に作成・削除できるのでELBの課金を抑えられて検証するときには嬉しいですね。
おわりに
勢いだけでデプロイできました。今回の私の目的である検証用途のデプロイには必要十分でした。CI/CDのパイプラインもできるみたいなので試したいのですが、そもそもCopilot使ってたのはFargateへデプロイするのに気乗りしないからでした。ここらで本題の検証に戻りたいと思います、それでは。
以上、網走の大村でした。